package com.tanhua.server.interceptor;

import com.tanhua.commons.utils.JwtUtils;
import com.tanhua.model.db.User;
import io.jsonwebtoken.Claims;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 自定义拦截器
 *    1、实现接口HandlerInterceptor
 *    2、按需重写内部的方法
 */
public class TokenInterceptor implements HandlerInterceptor {

    /**
     * 进入到Controller之前执行的方法
     *   登录校验：
     *     1、校验token是否正确
     *     2、如果token检验失败（token异常），相应401
     *     3、如果token正确，向后执行（放行）
     *  返回值：
     *     true：向后执行，执行Controller方法
     *     false：直接相应结束
     */
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //1、从request中获取请求头 Authorization
        String token = request.getHeader("Authorization");
        //2、调用工具类校验token
        boolean verifyToken = JwtUtils.verifyToken(token);
        //3、如果token失效，相应401,
        if(verifyToken == false) {
            response.setStatus(401); //未登录，手机端会解析401，跳转登录页面
            return false;
        }
        //4、解析token，获取其中的userId和手机号码
        Claims claims = JwtUtils.getClaims(token);
        Object obj = claims.get("id");
        Long userId = Long.valueOf(obj.toString());
        String mobile = claims.get("mobile").toString();
        //5、构造User对象（当前操作的用户）
        User user = new User();
        user.setId(userId);
        user.setMobile(mobile);
        //6、存入ThreadLocal
        UserHolder.set(user);
        return true;
    }



    /**
     * 请求和相应全部结束之前执行的逻辑
     */
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        UserHolder.remove(); //在请求响应结束时，将ThreadLocal中的数据清楚
    }
}
